package com.medusa.aps.business.modules.demand.service;

import com.medusa.aps.business.model.pagination.Page;
import com.medusa.aps.business.modules.demand.model.input.*;
import com.medusa.aps.business.modules.demand.model.output.ScheduleDetailOutSourcingModel;
import com.medusa.aps.business.modules.demand.model.output.ScheduleDetailSelfModel;
import com.medusa.aps.business.modules.demand.model.output.SchedulePageListModel;
import com.medusa.aps.business.modules.demand.model.output.ScheduleProcessDetailsVO;

import java.math.BigDecimal;
import java.util.Set;

/**
 * @author miskw
 * @date 2023/12/27
 */
public interface ScheduleService {
    /**
     * 分页查询排程运算列表
     *
     * @param schedulePageQuery 分页参数
     * @return 分页结果
     */
    Page<SchedulePageListModel> schedulePage(SchedulePageQuery schedulePageQuery);
    /**
     * 编辑排程订单
     *
     * @param orderParams 订单数据
     */
    void updateScheduleOrders(OrderParam orderParams);

    /**
     * 订单优先级
     *
     * @param orderIncrement 编辑变化值
     */
    void updateIncrementScheduleOrder(OrderIncrementParam orderIncrement);

    /**
     * 删除排程订单
     *
     * @param ids 订单id集合
     */
    void removeScheduleOrders(Set<Long> ids);

    /**
     * 释放占用物料
     *
     * @param id 订单id
     * @return 释放的物料数量
     */
    BigDecimal releaseOccupationMaterial(Integer id);

    /**
     * 排程明细-自制生产
     *
     * @param controlDetailParam 排程明细接收参数
     * @param page               分页参数
     * @return 分页结果
     */
    Page<ScheduleDetailSelfModel> selfControl(ControlDetailParam controlDetailParam, Page<ScheduleDetailSelfModel> page);

    /**
     * 排程明细-外购/委外生产
     *
     * @param controlDetailParam 排程明细接收参数
     * @param page               分页参数
     * @return 分页结果
     */
    Page<ScheduleDetailOutSourcingModel> unSelfControl(ControlDetailParam controlDetailParam, Page<ScheduleDetailOutSourcingModel> page);

    /**
     * 排程明细-工序明细
     *
     * @param scheduleProcessDetailsParam 参数
     * @return 结果
     */
    Page<ScheduleProcessDetailsVO> scheduleProcessDetail(ScheduleProcessDetailsParam scheduleProcessDetailsParam);
}
